/**
 * 用来管理有向图对应的邻接矩阵的类
 */
public class AdjacencyMatrix {
    private int[][] adjacencyMatrix;  // 邻接矩阵
    private int numVertices;          // 不同单词个数
    private String[] matrixName;      // 不同的单词

    /**
     * 构造器
     *
     * @param numVertices: 节点个数
     */
    public AdjacencyMatrix(int numVertices) {
        this.numVertices = numVertices;
        this.adjacencyMatrix = new int[numVertices][numVertices];
        this.matrixName = new String[numVertices];
    }

    /**
     * 设置所有的节点名
     *
     * @param names: 节点名
     */
    public void setMatrixName(String[] names) {
        this.matrixName = names.clone();
    }

    /**
     * 通过节点名获取对应的 index
     *
     * @param letter: 节点名
     * @return 对应的index
     */
    public int getIndexMatrix(String letter) {
        for (int i = 0; i < this.matrixName.length; i++) {
            if (this.matrixName[i].equals(letter)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 根据节点对应的 index 获取对应的节点名
     *
     * @param index
     * @return
     */
    public String getNameFromIndex(int index) {
        return this.matrixName[index];
    }

    /**
     * 获取所有的节点名
     *
     * @return
     */
    public String[] getMatrixName() {
        return this.matrixName.clone();
    }

    /**
     * 增加有向边，每增加一次，权重加 1
     * @param source 源
     * @param destination 目的
     */
    public void addEdge(int source, int destination) {
        adjacencyMatrix[source][destination] += 1;
    }

    /**
     * 移除有向边
     * @param source 源
     * @param destination 目的
     */
    public void removeEdge(int source, int destination) {
        adjacencyMatrix[source][destination] = 0;
    }

    public boolean hasEdge(int source, int destination) {
        // 检查是否有从source到destination的边
        return adjacencyMatrix[source][destination] != 0;
    }

    public int getWeight(int source, int destination) {
        // 获取从source到destination的边的权重
        return adjacencyMatrix[source][destination];
    }

    public int getNumVertices() {
        // 获取图中顶点的数量
        return this.numVertices;
    }

    public void printGraph() {
        for (int i = 0; i < this.matrixName.length; i++) {
            System.out.print(matrixName[i] + " ");
        }
        System.out.println();
        // 打印邻接矩阵
        for (int i = 0; i < numVertices; i++) {
            for (int j = 0; j < numVertices; j++) {
                System.out.print(adjacencyMatrix[i][j] + " ");
            }
            System.out.println();
        }
    }
}
